<?php
class plgSystemShortcuts extends JPlugin {
 
  function onAfterRender()
  {
    // пример обработки параметра
	if ($this->params->get('enable_replacement', 0) == 0) {
      return true;
	}
 
	$app =& JFactory::getApplication();
 
	// проверка, что мы не в административной панели
	if ($app->getName()!= 'site') {
	  return true;
	}
 
	// получаем текст сформированной страницы
	$text = JResponse::getBody();

	// делаем замены в тексте

	$replaces = array(
		'\БВив' => 'засл. арт. РФ Богдан Вивчаровский',
 	'\ВДяд' => 'засл. арт. РФ Владимир Дяденистов',
		'\АТро' => 'засл. арт. РФ Александр Трофимов',
		'\АКав' => 'засл. арт. РФ Александр Кавин',
		'\РКаш' => 'засл. арт. РФ Раф Кашапов',
		'\НУле' => 'засл. арт. РФ Наталья Улейская',
		'\ААса' => 'засл. арт. РФ Альберт Асадуллин',

		'\АКож' => 'Алла Кожевникова',
		'\ЕУль' => 'Елена Ульянова',
		'\КСми' => 'Кирилл Смирнов',
		'\ГПав' => 'Галина Павлова',
		'\ВНог' => 'Вячеслав Ногин',
		'\ТВор' => 'Татьяна Ворончихина',
		'\РНик' => 'Роман Никитин',
		'\ИПол' => 'Ирина Полевская',
		'\ААвд' => 'Антон Авдеев',
		'\АПоз' => 'Анна Позднякова',
		'\ДГол' => 'Дмитрий Голощапов',
		'\СМур' => 'Светлана Муратова',
		'\НЖур' => 'Наталия Журба',
		'\ОБар' => 'Оксана Баранова',
		'\ВГор' => 'Виктория Горбакова',

 	'\ВБар' => 'Виктория Барканова',
		'\ИВас' => 'Иван Васильев',
		'\МГай' => 'Марина Гайворонская',
		'\ИГор' => 'Инна Горбикова',
		'\ГДра' => 'Глеб Драчёв',
		'\ВКня' => 'Валентин Князев',
		'\ВКом' => 'Владимир Комаров',
		'\ОКра' => 'Ольга Красных',
		'\ДКрю' => 'Денис Крюков',
		'\ЕНик' => 'Елена Никитина',
		'\ВОвч' => 'Виктория Овчаренко',
		'\ААру' => 'Анастасия Арутюнян',
		'\АОси' => 'Александр Осинин',
		'\ПСте' => 'Павел Степанов',
		'\АХар' => 'Алина Харитонова',
		'\АЧер' => 'Анна Чернявская',
		'\ЕШир' => 'Евгений Шириков',
		'\ВШки' => 'Валерия Шкирандо',
		'\АЯко' => 'Анастасия Яковенко',

		'\Худрук' => 'Засл. деят. искусств РФ Владимир Подгородинский',
		'\Калле' => 'засл. арт. РФ Владимир Калле',
		'\ДБир' => 'Дмитрий Бирюков',
		'\АРод' => 'Алексей Родичев',
		'\СПро' => 'Сергей Прокопов',
		'\ППче' => 'засл. раб. культуры РФ Пётр Пчелинцев',
		'\ГЗат' => 'Глеб Затеев',
		'\МРем' => 'Михаил Ремизов',
		'\АЗат' => 'Александр Затеев',
		'\БВас' => 'Борис Васильев',
		'\АКаш' => 'Александр Кашапов',
		'\ЕОзо' => 'Елена Озолина',

		'\СГри' => 'засл. деят. искусств РФ Сергей Грицай',

		// -- Спектакли. Сокращение с "0" -- без линка
		'\ЮА0' => '«Юнона» и «Авось»',
		'\ИХС0' => '«Иисус Христос - суперзвезда»',
		'\ОЭ0' => '«Орфей и Эвридика»',
		'\Кент0' => '«Кентервильское привидение»',
		'\КПД0' => '«Капитанская дочка»',
		'\Сказка0' => '«Сказка о мёртвой царевне и о семи богатырях»',
		'\СП0' => '«Синяя птица»',
		'\ГУ0' => '«Гадкий утёнок, или Сказка о волшебных крыльях»',
		'\БЗ0' => '«Безымянная звезда»',
		'\РД0' => '«Ромео и Джульетта»',

		'\ЮА' => '<a href="http://rock-opera.ru/reper/juno.html">«Юнона» и «Авось»</a>',
		'\ИХС' => '<a href="http://rock-opera.ru/reper/jesus.html">«Иисус Христос - суперзвезда»</a>',
		'\ОЭ' => '<a href="http://rock-opera.ru/reper/orpheus.html">«Орфей и Эвридика»</a>',
		'\Кент' => '<a href="http://rock-opera.ru/reper/cent.html">«Кентервильское привидение»</a>',
		'\КПД' => '<a href="http://rock-opera.ru/reper/kapdoth.html">«Капитанская дочка»</a>',
		'\Сказка' => '<a href="http://rock-opera.ru/reper/skaz.html">«Сказка о мёртвой царевне и о семи богатырях»</a>',
		'\СП' => '<a href="http://rock-opera.ru/reper/bluebird.html">«Синяя птица»</a>',
		'\ГУ' => '<a href="http://rock-opera.ru/reper/badbird.html">«Гадкий утёнок, или Сказка о волшебных крыльях»</a>',
		'\БЗ' => '<a href="http://rock-opera.ru/reper/nonamestar.html">«Безымянная звезда»</a>',
		'\РД' => '<a href="http://rock-opera.ru/reper/ridzh.html">«Ромео и Джульетта»</a>',

		// -- Города и площадки
		'\СПб' => 'Санкт-Петербург',
		'\Газа' => 'ДК им. И. И. Газа',
		'\Акимова' => 'Театр комедии им. Н. Акимова');

    $text = strtr($text, $replaces);
		
    // Попробуем перетащить сюда типографику
    if ($this->params->get('enable_rustypo', 0)) {
	  global $Refs, $RefsCntr;
      define('TAGBEGIN', "\x01");
      define('TAGEND',   "\x02");
      $Refs = array(); // буфер для хранения тегов
      $RefsCntr = 0;   // счётчик буфера
      function putTag($x)
      {
	    global $Refs, $RefsCntr;
	    $Refs[] = $x[0];
	    return TAGBEGIN.($RefsCntr++).TAGEND;
      }
      function getTag($x)
      {
	    global $Refs;
	    return $Refs[$x[1]];
      }

      define('NOBRSPACE',  "\x03");
      define('NOBRHYPHEN', "\x04");
      define('THINSP',     "\x05");
      define('DASH',       "\x06");
      define('NUMDASH',    "\x07");

	  $htmlents = array(
		'&#8222;'=>'„','&#8219;'=>'“','&#8220;'=>'”','&#8216;'=>'‘','&#8217;'=>'’',
		'&laquo;'=>'«','&raquo;'=>'»','&hellip;'=>'…','&euro;'=>'€','&permil;'=>'‰',
		'&bull;'=>'•','&middot;'=>'·','&ndash;'=>'–','&mdash;'=>'—','&nbsp;'=>' ',
		'&trade;'=>'™','&copy;'=>'©','&reg;'=>'®','&sect;'=>'§','&#8470;'=>'№',
		'&plusmn;'=>'±','&deg;'=>'°');
	  $text = strtr( $text, $htmlents ); // Делаем замены html entity на символы из cp1251
		
      // РАБОТА С ТЕГАМИ. ЧАСТЬ 1
	  // 'spacesatend' 
	  $text = preg_replace( '/(?> | )+(?=$|<br|<\/p)/u', '', $text ); // Убираем лишние пробелы перед концом строки
	  // 'aquotes' 
	  $text = preg_replace( '/<a +href([^>]*)> *(?:"|&quot;)([^<"]*)(?:"|&quot;) *<\/a>/u', '"<a href\\1>\\2</a>"', $text ); // Выносим кавычки из ссылок
	  // 'shortatend' 
	  $text = preg_replace( '/([а-яА-Яa-zA-Z]) ([а-яА-Яa-zA-Z]{1,5}(?>[.!?…]*))(?=$|<\/p>|<\/div>|<br>|<br \/>)/u','\\1'.NOBRSPACE.'\\2', $text); // Последнее короткое слово в абзаце привязывать к предыдущему

	  // ПРЯМАЯ РЕЧЬ
	  // 'speech'
	  // $text = preg_replace( '/(^|<p>|<br>|<br \/>)[  ]?- /u','\\1— ', $text ); // Прямая речь - дефис в начале строки и после тегов <p>, <br> и <br />

	  // ВЫРЕЗАЕМ ТЕГИ
	  $Refs = array();
	  $RefsCntr = 0;
	  $text = preg_replace_callback('/<!--.*?-->/su', 'putTag', $text); // комментарии
	  $text = preg_replace_callback('/< *(script|style|pre|code|textarea).*?>.*?< *\/ *\1 *>/isu', 'putTag', $text); // теги, которые вырезаются вместе с содержимым
	  $text = preg_replace_callback('/<(?:[^\'"\>]+|".*?"|\'.*?\')+>/su', 'putTag', $text); // обычные теги

	  $text = strtr( $text, "\t\n\r", '   ' ); // Заменяем табуляцию и перевод строки на пробел
	  $text = preg_replace( '/ +/u', ' ', $text ); // Убираем лишние пробелы

	  $text = str_replace( '&quot;','"', $text ); // Заменяем &quot на "
	  $text = str_replace( '&#39;',"'", $text ); // Заменяем &#39 на '

      // РАССТАВЛЯЕМ КАВЫЧКИ
	  // 'quotes'
	  $text = preg_replace( '/(['.TAGEND.'\(  ]|^)"([^"]*)([^  "\(])"/u', '\\1«\\2\\3»', $text ); // Расстановка кавычек-"елочек"
	  if( JString::stristr( $text, '"' ) ) // Если есть вложенные кавычки
	  {
		$text = preg_replace( '/(['.TAGEND.'(  ]|^)"([^"]*)([^  "(])"/u', '\\1«\\2\\3»', $text );
		while( preg_match( '/«[^»]*«[^»]*»/u', $text ) )
		  $text = preg_replace( '/«([^»]*)«([^»]*)»/u', '«\\1„\\2“', $text );
	  }

      // ДЕЛАЕМ ЗАМЕНЫ
      //	$text = str_replace( '• ','•'.NOBRSPACE, $text ); // Пункт (для списков)
	  // 'dash'
	  // Тире
	  $text = str_replace( ' - ',NOBRSPACE.DASH.' ', $text );
	  $text = preg_replace( '/ - /u',NOBRSPACE.DASH.' ', $text );

	  // 'dots'
	  // $text = str_replace( '...','…', $text ); // Многоточие
	  // 'plusminus'
	  // $text = str_replace( '+/-','±', $text ); // плюс-минус

	  // 'registered' && $allowtags
	  // $text = str_replace( '(r)','<sup>®</sup>', $text );
	  // $text = str_replace( '(R)','<sup>®</sup>', $text ); // registered

	  // 'copyright'
	  // $text = preg_replace( '/\((c|C|с|С)\)/u','©', $text );
	  // 'nobrcopyright'
	  // $text = preg_replace( '/© /u','©'.NOBRSPACE, $text ); // copyright
	  // 'trademark'
	  // $text = str_replace( '(tm)','™', $text );
	  // $text = str_replace( '(TM)','™', $text );
	
      // ИНИЦИАЛЫ И ФАМИЛИИ
	  // 'initials'
	  $text = preg_replace( '/(?<=[^а-яА-ЯёЁa-zA-Z][А-ЯЁA-Z]\.|^[А-ЯЁA-Z]\.) ?([А-ЯЁA-Z]\.) ?(?=[А-ЯЁA-Z][а-яА-ЯёЁa-zA-Z])/u', THINSP.'\\1'.NOBRSPACE, $text ); // Инициалы + фамилия
	  $text = preg_replace( '/((?>[А-ЯЁA-Z][а-яА-ЯёЁa-zA-Z]+)) ([А-ЯЁA-Z]\.) ?(?=[А-ЯЁA-Z]\.)/u', '\\1'.NOBRSPACE.'\\2'.THINSP, $text ); // Фамилия + инициалы
	  $text = preg_replace( '/(?<=[^а-яА-ЯёЁa-zA-Z][А-ЯЁA-Z]\.|^[А-ЯЁA-Z]\.) ?(?=[А-ЯЁA-Z][а-яА-ЯёЁa-zA-Z])/u', NOBRSPACE, $text ); // Инициал + фамилия
	  $text = preg_replace( '/((?>[А-ЯЁA-Z][а-яА-ЯёЁa-zA-Z]+)) (?=[А-ЯЁA-Z]\.)/u', '\\1'.NOBRSPACE, $text ); // Фамилия + инициал

      // СОКРАЩЕНИЯ
	  // 'abr'
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]|^)(г\.|ул\.|пер\.|пл\.|пос\.|р\.|проф\.|доц\.|акад\.|гр\.) ?(?=[А-ЯЁ])/u', '\\1\\2'.NOBRSPACE, $text ); // Сокращения
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]|^)(с\.|стр\.|рис\.|гл\.|илл\.|табл\.|кв\.|дом|д.\|офис|оф\.|ауд\.) ?(?=\d)/u', '\\1\\2'.NOBRSPACE, $text ); // Сокращения
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]|^)(см\.|им\.|каф\.) ?(?=[а-яА-ЯёЁa-zA-Z\d])/u', '\\1\\2'.NOBRSPACE, $text ); // Сокращения
	
      // ЕДИНИЦЫ ИЗМЕРЕНИЯ
	  // 'units'
	  // $text = preg_replace( '/([а-яёa-z\d\.]) (?=экз\.|тыс\.|млн\.|млрд\.|руб\.|коп\.|у\.е\.|\$|€)/u', '\\1'.NOBRSPACE, $text ); // Единицы измерения
	  // $text = preg_replace( '/([а-яёa-z\d\.]) (?=евро([ \.,!\?:;]|$))/u', '\\1'.NOBRSPACE, $text ); // Евро

      // ПРИВЯЗЫВАЕМ КОРОТКИЕ СЛОВА
	  // 'shortwords'
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z0-9])(я|ты|мы|вы|он|не|ни|на|но|в|во|до|от|и|а|с|со|о|об|ну|к|ко|за|их|из|ее|её|ей|ой|ай|у) (?=[а-яА-ЯёЁa-zA-Z]{3})/u', '\\1\\2'.NOBRSPACE, $text ); // Короткие слова прикрепляем к следующим (если те сами не короткие)
	  $text = preg_replace( '/([а-яА-ЯёЁ]) (?=(же|ж|ли|ль|бы|б|ка|то)([\.,!\?:;])?( |$))/u', '\\1'.NOBRSPACE, $text ); // Частицы
	  $text = preg_replace( '/([.!?…] [А-ЯЁA-Z][а-яА-ЯёЁa-zA-Z]{0,3}) /u', '\\1'.NOBRSPACE, $text ); // Слова от 1 до 3 букв в начале предложения

      // И Т.Д., И Т.П., Т.К., ...
	  // 'etc'
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]и) (д|п)(?=р\.)/u', '\\1'.NOBRSPACE.'\\2', $text ); // и др., и пр.
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]и) т\. ?(?=(д|п)\.)/u', '\\1'.NOBRSPACE.'т.'.THINSP, $text ); // и т.д., и т.п.
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]в) т\. ?(?=ч\.)/u', '\\1'.NOBRSPACE.'т.'.THINSP, $text ); // в т.ч.
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z]т\.) ?(?=(к|н|е)\.)/u', '\\1'.THINSP, $text ); // т.к., т.н., т.е.
	  $text = preg_replace( '/([^а-яА-ЯёЁa-zA-Z](к|д)\.) ?(ф\.-м|х|б|т|ф|п)\. ?(?=н\.)/u', '\\1'.THINSP.'\\2.'.THINSP, $text ); // к.т.н., д.ф.-м.н., ...

      // ИСПРАВЛЕНИЕ ГРАММАТИЧЕСКИХ ОШИБОК
	  // 'spinbracket'
	  // $text = preg_replace( '/\( *([^)]+?) *\)/u', '(\\1)', $text ); // удаляем пробелы после открывающей скобки и перед закрыващей скобкой
	  // 'spbeforebracket'
	  // $text = preg_replace( '/([а-яА-ЯёЁa-zA-Z.,!?:;…])\(/u', '\\1 (', $text ); // добавляем пробел между словом и открывающей скобкой, если его нет (отключите, если у Вас на сайте есть формулы)
	  // 'commanum'
	  // $text = preg_replace( '/([а-яА-ЯёЁa-zA-Z]),(?=\d)/u','\\1, ', $text); // Делает проверку в расстановке запятых и меняет слово,число на слово, число (ул. Дружбы, 46)
	  // 'dotdash'
	  // Тире от запятой и точки не отбивается
	  // $text = str_replace( ','.NOBRSPACE.DASH.' ',','.DASH.' ', $text );
	  // $text = str_replace( '.'.NOBRSPACE.DASH.' ','.'.DASH.' ', $text );

	  // 'exclquest'
	  // $text = str_replace( '!?','?!', $text ); // Правильно в таком порядке
	  // 'exclquestdots'
	  // $text = preg_replace( '/(!|\?)(?:…|\.\.\.)/u','\\1..', $text ); // Убираем лишние точки
      // 'sppunct'
      // $text = preg_replace( '/ (?=[.,!?:;])/u','', $text ); // Убираем пробелы перед знаками препинания
	  // 'nummarksp'
	  // $text = preg_replace( '/(№|§) ?(?=\d)/u', '\\1 ', $text ); // пробел между знаком "№" или "§" и числом.
	  // 'numnummark'
	  // $text = preg_replace( '/№ №/u', '№№', $text ); // слитное написание "№№"
	  // 'sectsectmark'
	  // $text = preg_replace( '/§ §/u', '§§', $text ); // слитное написание "§§"

      // КОРОТКИЙ ПРОБЕЛ
	  $text = str_replace( THINSP,'&thinsp;', $text );
	
      // НЕРАЗРЫВНЫЙ ПРОБЕЛ
	  $text = str_replace( NOBRSPACE,'&nbsp;', $text );
	  $text = preg_replace( '/(?<=^| |'.TAGEND.')([^ '.TAGBEGIN.TAGEND.NOBRHYPHEN.DASH.NUMDASH.']+['.NOBRHYPHEN.DASH.NUMDASH.'][^ '.TAGBEGIN.']+)(?=$| |'.TAGBEGIN.')/u','<nobr>\\1</nobr>', $text );

      // НЕРАЗРЫВНЫЙ ДЕФИС
	  $text = str_replace( NOBRHYPHEN,'-', $text );

      // ТИРЕ
	  $text = str_replace( DASH,'—', $text );
	  $text = str_replace( NUMDASH,'–', $text ); // ndash
	
      // ВОЗВРАЩАЕМ ТЕГИ НА МЕСТО
	  while(preg_match('/'.TAGBEGIN.'\d+'.TAGEND.'/u', $text))
		$text = preg_replace_callback('/'.TAGBEGIN.'(\d+)'.TAGEND.'/u', 'getTag', $text);

	  $text = trim($text);
	}

	if ($text != '') {
		// подменяем текст страницы
		JResponse::setBody($text);
	}
	return true;
  }
}
?>